#include <iostream>
#include "math.h"

int main()
{
    int n=5;
    double f1[n+1][n+1],f2[n+1][n+1];  
    int a;
    int u=0;//a用作方程的迭代判断 u用于方程迭代次数的计数 
    double t_n=400,t_s=400,t_w=500,t_e=300,t_i=50;//四方向及内部初值
    // double len=0.5;
    // double dx,dy;
    // dx=dy=len/n;
    double k=0.1;//传热系数
    int i,j;

//初始化   
     for(i=0;i<=n+1;i++)      //s
    {
         j=0;
         f1[i][j]=t_s;
    }
     for(j=0;j<=n+1;j++)      //w
    {
         i=0;
         f1[i][j]=t_w;
    }
     for(i=0;i<=n+1;i++)      //n
    {
         j=n+1;
         f1[i][j]=t_n;
    }
     for(j=0;j<=n+1;j++)      //e
    {
         i=n+1;
         f1[i][j]=t_e;
    }
     for(i=1;i<n+1;i++)
    {
         for(j=1;j<n+1;j++)//内部
        {
             f1[i][j]=t_i;
        }
    }

//迭代
     do
    {
         a=0;     //给后面判断是否继续迭代 
        for(i=0;i<=n+1;i++)
        {
	    for(j=0;j<=n+1;j++)
	    {
                 f2[i][j]=f1[i][j];
	    }
        }
        for(i=2;i<=n-1;i++)//s 
        {
             j=1;
             f1[i][j]=(k*f1[i][j+1]+k*f1[i-1][j]+2*k*f1[i][j-1]+k*f1[i+1][j])/(5*k);
        }
        for(j=2;j<=n-1;j++)//w
        {
             i=1;
             f1[i][j]=(k*f1[i][j+1]+2*k*f1[i-1][j]+k*f1[i][j-1]+k*f1[i+1][j])/(5*k);
        }	 
        for(i=2;i<=n-1;i++)//n
        {
             j=n;
             f1[i][j]=(2*k*f1[i][j+1]+k*f1[i-1][j]+k*f1[i][j-1]+k*f1[i+1][j])/(5*k);
        }
        for(j=2;j<=n-1;j++)//e 
        {
             i=n;
             f1[i][j]=(k*f1[i][j+1]+k*f1[i-1][j]+k*f1[i][j-1]+2*k*f1[i+1][j])/(5*k);
        }

        i=1;j=1;//左下角
        {
	     f1[i][j]=(k*f1[i][j+1]+2*k*f1[i-1][j]+2*k*f1[i][j-1]+k*f1[i+1][j])/(6*k);
        }
        i=1;j=n;//左上角
        {
	     f1[i][j]=(k*f1[i][j+1]+k*f1[i-1][j]+2*k*f1[i][j-1]+2*k*f1[i+1][j])/(6*k);
        }
        i=n;j=1;//右下角
        {
	     f1[i][j]=(2*k*f1[i][j+1]+2*k*f1[i-1][j]+k*f1[i][j-1]+k*f1[i+1][j])/(6*k);
        }
        i=n;j=n;//右上角
        {
	     f1[i][j]=(2*k*f1[i][j+1]+k*f1[i-1][j]+k*f1[i][j-1]+2*k*f1[i+1][j])/(6*k);
        }
	
        for(i=2;i<n;i++)//内部 
        {
	    for(j=2;j<n;j++)
            {   
		f1[i][j]=(k*f1[i][j+1]+k*f1[i-1][j]+k*f1[i][j-1]+k*f1[i+1][j])/(4*k);       
            }
        }
	
        for(i=1;i<n+1;i++)
        {
	    for(j=1;j<n+1;j++)
	    {
		if(fabs(f1[i][j]-f2[i][j])>=1e-3)//保证前一次迭代值与后一次的迭代 值之差在1e-3内
		{
                    a=1;
		}
            }
        }
        u++;      
     }
    while(a==1);
     
    for(j=1;j<n+1;j++)  
    {
        for(i=1;i<n+1;i++)
        {
             std::cout<<f1[i][j]<<" ";
        }
      std::cout << std::endl;
    }
    std::cout<<"迭代次数="<<u<<std::endl; 

}
